
package net.qiqbframework.modelling.domain;


import net.qiqbframework.commandhandling.CommandMessage;
import net.qiqbframework.messaging.Message;

import java.util.Objects;

/**
 * 描述一个聚合对象
 */
public interface Aggregate<T> {
    /**
     * 获取此聚合的唯一标识符（字符串形式）
     */
    default String identifierAsString() {
        return Objects.toString(identifier(), null);
    }
    /**
     * 获取此聚合的唯一标识符
     *
     * @return 聚合唯一标识符
     */
    Object identifier();

    /**
     * 获取聚合类型的 String 表示形式。除非另有配置，否则默认为该名称的 rootType() 简单名称
     *
     * @return The aggregate's type
     */
    String type();

    /**
     * 获取聚合根ID
     *
     * @return
     */
    AnnotatedBizIdentifier<?> aggregateRootId();

    T aggregateRoot();


    /**
     * 获取聚合的版本。用于乐观锁用途
     *
     * @return 聚合版本
     */
    Long version();

    /**
     * 处理聚合根的消息
     *
     * @param message 待处理的消息
     * @return 处理结果。如果没有放回值，则返回 null
     * {@link CommandMessage} yields no results
     * @throws Exception in case one is triggered during message processing
     */
    Object handle(Message<?> message) throws Exception;


    boolean isDeleted();

    /**
     * 此聚合根是否是新建的
     *
     * @return
     */
    boolean isNew();

    /**
     * 获取 Aggregate 在命令处理时遵循的包装聚合根的类类型。
     */
    Class<? extends T> rootType();

}
